package controller

import (
	"bluebell-backend/common"
	"bluebell-backend/dao/mysql"
	"bluebell-backend/model/po"
	"bluebell-backend/model/vo"
	"bluebell-backend/service"
	"fmt"
	"github.com/gin-gonic/gin"
	"strconv"
)

func GetCateGoryInfo() {

}

func AddCateGory(c *gin.Context) {
	uuid, ok := c.Get(common.CtxUserIDKey)
	if !ok {
		fmt.Println(common.GetMsg(common.CodeNeedLogin))
		common.Error(c, common.CodeNeedLogin)
		return
	}
	// 判断是否是管理员
	if !IsAdmin(uuid.(int64)) {
		common.Error(c, common.CodePermissions)
		return
	}
	// 解析参数
	category := new(po.Category)
	if err := c.ShouldBindJSON(category); err != nil {
		common.Error(c, common.ERROR)
		return
	}

	code, err := service.AddCateGory(category)
	if err != nil {
		common.Error(c, common.ERROR)
		return
	}
	common.OK(c, code, nil)
	return
}

func DeleteCategory(c *gin.Context) {
	uuid, ok := c.Get(common.CtxUserIDKey)
	if !ok {
		fmt.Println(common.GetMsg(common.CodeNeedLogin))
		common.Error(c, common.CodeNeedLogin)
		return
	}
	// 判断是否是管理员
	if !IsAdmin(uuid.(int64)) {
		common.Error(c, common.CodePermissions)
		return
	}
	// 解析参数
	id := c.Param("id")
	parseIntId, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		fmt.Println("解析失败")
		return
	}

	// 逻辑
	code, err := service.DeleteCateGory(parseIntId)
	if err != nil {
		common.Error(c, common.ERROR)
		return
	}
	common.OK(c, code, nil)
	return
}

func UpdateCategoryInfo(c *gin.Context) {
	uuid, ok := c.Get(common.CtxUserIDKey)
	if !ok {
		fmt.Println(common.GetMsg(common.CodeNeedLogin))
		common.Error(c, common.CodeNeedLogin)
		return
	}
	// 判断是否是管理员
	if !IsAdmin(uuid.(int64)) {
		common.Error(c, common.CodePermissions)
		return
	}
	// 解析参数
	category := new(po.Category)
	if err := c.ShouldBindJSON(category); err != nil {
		fmt.Println("参数解析失败")
		return
	}
	// 逻辑
	code, err := service.UpdateCateGoryInfo(category)
	if err != nil {
		common.Error(c, common.ERROR)
		return
	}
	common.OK(c, code, nil)
	return
}

func GetCategoryInfo(c *gin.Context) {
	// 参数解析
	param := c.Param("id")
	id, err := strconv.ParseInt(param, 10, 64)
	if err != nil {
		fmt.Println("参数解析失败")
		return
	}
	category, err := service.GetCategoryInfo(id)
	if err != nil {
		common.Error(c, common.ERROR)
		return
	}
	common.OK(c, common.SUCCESS, category)
	return
}

// TODO 分页
func GetAllPostByCategoryId(c *gin.Context) {
	// 解析参数
	// TODO 根据时间或者分数排序
	postVo := &vo.PostVo{
		Page:  1,
		Size:  8,
		Order: common.ORDER_SCORE,
	}
	if err := c.ShouldBindQuery(postVo); err != nil {
		common.Error(c, common.ERROR)
		return
	}
	param := c.Param("id")
	id, err := strconv.ParseInt(param, 10, 64)
	if err != nil {
		fmt.Println("参数解析失败")
		return
	}
	postVo.Cid = id
	categoryAndPostsInfo, err := service.NewCategoryAllInfo().GetAllPostByCategoryId(postVo)
	if err != nil {
		common.Error(c, common.ERROR)
		return
	}
	common.OK(c, common.SUCCESS, categoryAndPostsInfo)
	return
}

func IsAdmin(uuid int64) bool {

	// 查询出所信息
	user, err := mysql.GetOneByUUID(uuid)
	if err != nil {
		fmt.Println("不存在信息")
		return false
	}
	if user.Role == 0 {
		return false
	}
	return true

}
